From 1aa0f79e8bc58d2182a2cff4cbc65f543966c908 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 31 Dec 2016 13:24:21 +0100 Subject: [PATCH] vulkan: Make the effect renderer take matrix + offset This is in preparation for the new color matrix node. I don't think keeping support for a separate opacity shader is worth it. --- gsk/gskvulkaneffectpipeline.c | 35 ++++++++++++++++-- gsk/gskvulkaneffectpipelineprivate.h | 3 +- gsk/gskvulkanrender.c | 6 +-- gsk/gskvulkanrenderpass.c | 19 ++++++++-- gsk/gskvulkanrenderprivate.h | 6 +-- ...sl => color-matrix-clip-rounded.frag.glsl} | 24 +++++++++--- .../vulkan/color-matrix-clip-rounded.frag.spv | Bin 0 -> 6588 bytes ...sl => color-matrix-clip-rounded.vert.glsl} | 13 ++++--- .../vulkan/color-matrix-clip-rounded.vert.spv | Bin 0 -> 5292 bytes .../vulkan/color-matrix-clip.frag.glsl | 31 ++++++++++++++++ .../vulkan/color-matrix-clip.frag.spv | Bin 0 -> 2160 bytes ....vert.glsl => color-matrix-clip.vert.glsl} | 9 +++-- .../vulkan/color-matrix-clip.vert.spv | Bin 0 -> 4956 bytes gsk/resources/vulkan/color-matrix.frag.glsl | 31 ++++++++++++++++ gsk/resources/vulkan/color-matrix.frag.spv | Bin 0 -> 2160 bytes ...acity.vert.glsl => color-matrix.vert.glsl} | 9 +++-- gsk/resources/vulkan/color-matrix.vert.spv | Bin 0 -> 2316 bytes .../vulkan/opacity-clip-rounded.frag.spv | Bin 5584 -> 0 bytes .../vulkan/opacity-clip-rounded.vert.spv | Bin 5124 -> 0 bytes gsk/resources/vulkan/opacity-clip.frag.glsl | 19 ---------- gsk/resources/vulkan/opacity-clip.frag.spv | Bin 1068 -> 0 bytes gsk/resources/vulkan/opacity-clip.vert.spv | Bin 4788 -> 0 bytes gsk/resources/vulkan/opacity.frag.glsl | 19 ---------- gsk/resources/vulkan/opacity.frag.spv | Bin 1068 -> 0 bytes gsk/resources/vulkan/opacity.vert.spv | Bin 2148 -> 0 bytes 25 files changed, 154 insertions(+), 70 deletions(-) rename gsk/resources/vulkan/{opacity-clip-rounded.frag.glsl => color-matrix-clip-rounded.frag.glsl} (75%) create mode 100644 gsk/resources/vulkan/color-matrix-clip-rounded.frag.spv rename gsk/resources/vulkan/{opacity-clip-rounded.vert.glsl => color-matrix-clip-rounded.vert.glsl} (79%) create mode 100644 gsk/resources/vulkan/color-matrix-clip-rounded.vert.spv create mode 100644 gsk/resources/vulkan/color-matrix-clip.frag.glsl create mode 100644 gsk/resources/vulkan/color-matrix-clip.frag.spv rename gsk/resources/vulkan/{opacity-clip.vert.glsl => color-matrix-clip.vert.glsl} (83%) create mode 100644 gsk/resources/vulkan/color-matrix-clip.vert.spv create mode 100644 gsk/resources/vulkan/color-matrix.frag.glsl create mode 100644 gsk/resources/vulkan/color-matrix.frag.spv rename gsk/resources/vulkan/{opacity.vert.glsl => color-matrix.vert.glsl} (74%) create mode 100644 gsk/resources/vulkan/color-matrix.vert.spv delete mode 100644 gsk/resources/vulkan/opacity-clip-rounded.frag.spv delete mode 100644 gsk/resources/vulkan/opacity-clip-rounded.vert.spv delete mode 100644 gsk/resources/vulkan/opacity-clip.frag.glsl delete mode 100644 gsk/resources/vulkan/opacity-clip.frag.spv delete mode 100644 gsk/resources/vulkan/opacity-clip.vert.spv delete mode 100644 gsk/resources/vulkan/opacity.frag.glsl delete mode 100644 gsk/resources/vulkan/opacity.frag.spv delete mode 100644 gsk/resources/vulkan/opacity.vert.spv diff --git a/gsk/gskvulkaneffectpipeline.c b/gsk/gskvulkaneffectpipeline.c index 249185c1cf..8572da56dc 100644 --- a/gsk/gskvulkaneffectpipeline.c +++ b/gsk/gskvulkaneffectpipeline.c @@ -13,7 +13,8 @@ struct _GskVulkanEffectInstance { float rect[4]; float tex_rect[4]; - float value; + float color_matrix[16]; + float color_offset[4]; }; G_DEFINE_TYPE (GskVulkanEffectPipeline, gsk_vulkan_effect_pipeline, GSK_TYPE_VULKAN_PIPELINE) @@ -45,7 +46,31 @@ gsk_vulkan_effect_pipeline_get_input_state_create_info (GskVulkanPipeline *self) .location = 2, .binding = 0, .format = VK_FORMAT_R32G32B32A32_SFLOAT, - .offset = G_STRUCT_OFFSET (GskVulkanEffectInstance, value), + .offset = G_STRUCT_OFFSET (GskVulkanEffectInstance, color_matrix), + }, + { + .location = 3, + .binding = 0, + .format = VK_FORMAT_R32G32B32A32_SFLOAT, + .offset = G_STRUCT_OFFSET (GskVulkanEffectInstance, color_matrix) + sizeof (float) * 4, + }, + { + .location = 4, + .binding = 0, + .format = VK_FORMAT_R32G32B32A32_SFLOAT, + .offset = G_STRUCT_OFFSET (GskVulkanEffectInstance, color_matrix) + sizeof (float) * 8, + }, + { + .location = 5, + .binding = 0, + .format = VK_FORMAT_R32G32B32A32_SFLOAT, + .offset = G_STRUCT_OFFSET (GskVulkanEffectInstance, color_matrix) + sizeof (float) * 12, + }, + { + .location = 6, + .binding = 0, + .format = VK_FORMAT_R32G32B32A32_SFLOAT, + .offset = G_STRUCT_OFFSET (GskVulkanEffectInstance, color_offset), } }; static const VkPipelineVertexInputStateCreateInfo info = { @@ -100,7 +125,8 @@ void gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipeline, guchar *data, const graphene_rect_t *rect, - float value) + const graphene_matrix_t *color_matrix, + const graphene_vec4_t *color_offset) { GskVulkanEffectInstance *instance = (GskVulkanEffectInstance *) data; @@ -112,7 +138,8 @@ gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipelin instance->tex_rect[1] = 0.0; instance->tex_rect[2] = 1.0; instance->tex_rect[3] = 1.0; - instance->value = value; + graphene_matrix_to_float (color_matrix, instance->color_matrix); + graphene_vec4_to_float (color_offset, instance->color_offset); } gsize diff --git a/gsk/gskvulkaneffectpipelineprivate.h b/gsk/gskvulkaneffectpipelineprivate.h index 9a82c0242e..d2bff8105c 100644 --- a/gsk/gskvulkaneffectpipelineprivate.h +++ b/gsk/gskvulkaneffectpipelineprivate.h @@ -21,7 +21,8 @@ gsize gsk_vulkan_effect_pipeline_count_vertex_data (GskVulk void gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipeline, guchar *data, const graphene_rect_t *rect, - float value); + const graphene_matrix_t *color_matrix, + const graphene_vec4_t *color_offset); gsize gsk_vulkan_effect_pipeline_draw (GskVulkanEffectPipeline *pipeline, VkCommandBuffer command_buffer, gsize offset, diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c index 81bc3193b5..35e2dce295 100644 --- a/gsk/gskvulkanrender.c +++ b/gsk/gskvulkanrender.c @@ -321,9 +321,9 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self, { "linear", gsk_vulkan_linear_gradient_pipeline_new }, { "linear-clip", gsk_vulkan_linear_gradient_pipeline_new }, { "linear-clip-rounded", gsk_vulkan_linear_gradient_pipeline_new }, - { "opacity", gsk_vulkan_effect_pipeline_new }, - { "opacity-clip", gsk_vulkan_effect_pipeline_new }, - { "opacity-clip-rounded", gsk_vulkan_effect_pipeline_new } + { "color-matrix", gsk_vulkan_effect_pipeline_new }, + { "color-matrix-clip", gsk_vulkan_effect_pipeline_new }, + { "color-matrix-clip-rounded", gsk_vulkan_effect_pipeline_new } }; g_return_val_if_fail (type < GSK_VULKAN_N_PIPELINES, NULL); diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c index 70f1de35c5..b005607423 100644 --- a/gsk/gskvulkanrenderpass.c +++ b/gsk/gskvulkanrenderpass.c @@ -171,11 +171,11 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self, case GSK_OPACITY_NODE: if (gsk_vulkan_clip_contains_rect (&constants->clip, &node->bounds)) - pipeline_type = GSK_VULKAN_PIPELINE_OPACITY; + pipeline_type = GSK_VULKAN_PIPELINE_COLOR_MATRIX; else if (constants->clip.type == GSK_VULKAN_CLIP_RECT) - pipeline_type = GSK_VULKAN_PIPELINE_OPACITY_CLIP; + pipeline_type = GSK_VULKAN_PIPELINE_COLOR_MATRIX_CLIP; else if (constants->clip.type == GSK_VULKAN_CLIP_ROUNDED_CIRCULAR) - pipeline_type = GSK_VULKAN_PIPELINE_OPACITY_CLIP_ROUNDED; + pipeline_type = GSK_VULKAN_PIPELINE_COLOR_MATRIX_CLIP_ROUNDED; else FALLBACK ("Opacity nodes can't deal with clip type %u\n", constants->clip.type); op.type = GSK_VULKAN_OP_OPACITY; @@ -554,11 +554,22 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self, case GSK_VULKAN_OP_OPACITY: { + graphene_matrix_t color_matrix; + graphene_vec4_t color_offset; + graphene_matrix_init_from_float (&color_matrix, + (float[16]) { + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, gsk_opacity_node_get_opacity (op->render.node) + }); + graphene_vec4_init (&color_offset, 0.0, 0.0, 0.0, 0.0); op->render.vertex_offset = offset + n_bytes; gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline), data + n_bytes + offset, &op->render.node->bounds, - gsk_opacity_node_get_opacity (op->render.node)); + &color_matrix, + &color_offset); n_bytes += op->render.vertex_count; } break; diff --git a/gsk/gskvulkanrenderprivate.h b/gsk/gskvulkanrenderprivate.h index 6de38d2747..cffce7f0c5 100644 --- a/gsk/gskvulkanrenderprivate.h +++ b/gsk/gskvulkanrenderprivate.h @@ -17,9 +17,9 @@ typedef enum { GSK_VULKAN_PIPELINE_LINEAR_GRADIENT, GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP, GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP_ROUNDED, - GSK_VULKAN_PIPELINE_OPACITY, - GSK_VULKAN_PIPELINE_OPACITY_CLIP, - GSK_VULKAN_PIPELINE_OPACITY_CLIP_ROUNDED, + GSK_VULKAN_PIPELINE_COLOR_MATRIX, + GSK_VULKAN_PIPELINE_COLOR_MATRIX_CLIP, + GSK_VULKAN_PIPELINE_COLOR_MATRIX_CLIP_ROUNDED, /* add more */ GSK_VULKAN_N_PIPELINES } GskVulkanPipelineType; diff --git a/gsk/resources/vulkan/opacity-clip-rounded.frag.glsl b/gsk/resources/vulkan/color-matrix-clip-rounded.frag.glsl similarity index 75% rename from gsk/resources/vulkan/opacity-clip-rounded.frag.glsl rename to gsk/resources/vulkan/color-matrix-clip-rounded.frag.glsl index 91c1e54437..c0e42cac6d 100644 --- a/gsk/resources/vulkan/opacity-clip-rounded.frag.glsl +++ b/gsk/resources/vulkan/color-matrix-clip-rounded.frag.glsl @@ -7,9 +7,10 @@ struct RoundedRect { layout(location = 0) in vec2 inPos; layout(location = 1) in vec2 inTexCoord; -layout(location = 2) in flat float inOpacity; -layout(location = 3) in flat vec4 inClipBounds; -layout(location = 4) in flat vec4 inClipWidths; +layout(location = 2) in flat vec4 inClipBounds; +layout(location = 3) in flat vec4 inClipWidths; +layout(location = 4) in flat mat4 inColorMatrix; +layout(location = 8) in flat vec4 inColorOffset; layout(set = 0, binding = 0) uniform sampler2D inTexture; @@ -51,14 +52,25 @@ float clip(vec2 pos, RoundedRect r) { } vec4 -opacity (vec4 color, float value) +color_matrix (vec4 color, mat4 color_matrix, vec4 color_offset) { - return color * value; + /* unpremultiply */ + if (color.a != 0.0) + color.rgb /= color.a; + + color = color_matrix * color + color_offset; + color = clamp(color, 0.0, 1.0); + + /* premultiply */ + if (color.a != 0.0) + color.rgb *= color.a; + + return color; } void main() { RoundedRect r = RoundedRect(vec4(inClipBounds.xy, inClipBounds.xy + inClipBounds.zw), inClipWidths); - color = opacity (texture (inTexture, inTexCoord), inOpacity) * clip (inPos, r); + color = color_matrix (texture (inTexture, inTexCoord), inColorMatrix, inColorOffset) * clip (inPos, r); } diff --git a/gsk/resources/vulkan/color-matrix-clip-rounded.frag.spv b/gsk/resources/vulkan/color-matrix-clip-rounded.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..f4c753aae688db2c02d395969f61ed8772d4b72d GIT binary patch literal 6588 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 Zp?#fLO<&yKoy6uehja9JChGnM{~vW3$i)Bv literal 0 HcmV?d00001 diff --git a/gsk/resources/vulkan/color-matrix-clip.frag.glsl b/gsk/resources/vulkan/color-matrix-clip.frag.glsl new file mode 100644 index 0000000000..21a324e780 --- /dev/null +++ b/gsk/resources/vulkan/color-matrix-clip.frag.glsl @@ -0,0 +1,31 @@ +#version 420 core + +layout(location = 0) in vec2 inTexCoord; +layout(location = 1) in flat mat4 inColorMatrix; +layout(location = 5) in flat vec4 inColorOffset; + +layout(set = 0, binding = 0) uniform sampler2D inTexture; + +layout(location = 0) out vec4 color; + +vec4 +color_matrix (vec4 color, mat4 color_matrix, vec4 color_offset) +{ + /* unpremultiply */ + if (color.a != 0.0) + color.rgb /= color.a; + + color = color_matrix * color + color_offset; + color = clamp(color, 0.0, 1.0); + + /* premultiply */ + if (color.a != 0.0) + color.rgb *= color.a; + + return color; +} + +void main() +{ + color = color_matrix (texture (inTexture, inTexCoord), inColorMatrix, inColorOffset); +} diff --git a/gsk/resources/vulkan/color-matrix-clip.frag.spv b/gsk/resources/vulkan/color-matrix-clip.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..266c8777f56187e47dba4756918856154274e0b5 GIT binary patch literal 2160 zcmZ{jSx=Ke6o#j?MfOE@acRK?K@qiV5)eeFOR*>>UN%jaC8^9aCn$I zYQC?Oa+RP~$`yk~sn85gO7J>Dyr5R792dicxESH{Z_e2lrL(1+GbHKHCQc8d0^hJY z9h0QLE0V;>^SoK<#(a28opou%sI}(o4dR~f0 zKKgkoNj=^b{*Giszz-jL*ZGJ)cRKGy9Gm%(L;R)FegD|Zkoc0O$T_?{ANTwr53{8f zZ_OV1T;88O^fqz!5PMzxP04M6`(V>^TA<%|stWI!00;kuPNY6Q_}n2Y&_6NG!X`%U zYk}U0aW3|%BE;SZ{Qjv&9&vcgir8=6ctzmO@Zs{YU(4cgmma5c&)$%q-RE5fB)62$ zZVe0Y**W@SW+MXrZ{o0D8@cPi#WKM{RUpds2F9?aT7v_iw>(5KdN| zv%}W}e1MPnGTVK1Mm!-V!wzagERFRH{WZVGVld(JKCy!%JTnUM|;zdsY7=iio2&3#p*=A6L0 zhv8#)?^GrR-$WaIZcupk|u-+>3x`Pczs_XT|H z0J^XJPl&< TYu`80*Lx(LdVds0=QsBk!$zG( literal 0 HcmV?d00001 diff --git a/gsk/resources/vulkan/opacity-clip.vert.glsl b/gsk/resources/vulkan/color-matrix-clip.vert.glsl similarity index 83% rename from gsk/resources/vulkan/opacity-clip.vert.glsl rename to gsk/resources/vulkan/color-matrix-clip.vert.glsl index 4cf0f13b64..94d4ef8f90 100644 --- a/gsk/resources/vulkan/opacity-clip.vert.glsl +++ b/gsk/resources/vulkan/color-matrix-clip.vert.glsl @@ -2,7 +2,8 @@ layout(location = 0) in vec4 inRect; layout(location = 1) in vec4 inTexRect; -layout(location = 2) in float inOpacity; +layout(location = 2) in mat4 inColorMatrix; +layout(location = 6) in vec4 inColorOffset; layout(push_constant) uniform PushConstants { mat4 mvp; @@ -12,7 +13,8 @@ layout(push_constant) uniform PushConstants { } push; layout(location = 0) out vec2 outTexCoord; -layout(location = 1) out flat float outOpacity; +layout(location = 1) out flat mat4 outColorMatrix; +layout(location = 5) out flat vec4 outColorOffset; out gl_PerVertex { vec4 gl_Position; @@ -45,5 +47,6 @@ void main() { texrect = vec4(inTexRect.xy + inTexRect.zw * texrect.xy, inTexRect.zw * texrect.zw); outTexCoord = texrect.xy + texrect.zw * offsets[gl_VertexIndex]; - outOpacity = inOpacity; + outColorMatrix = inColorMatrix; + outColorOffset = inColorOffset; } diff --git a/gsk/resources/vulkan/color-matrix-clip.vert.spv b/gsk/resources/vulkan/color-matrix-clip.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..6648e245ba0bcfabd4d69739fb13b23353b78d55 GIT binary patch literal 4956 zcmZ9OhjUa_6vm&VP_5Vt2C*Vy11zYZr~wU=sEB1old!uXtIKZO-9#)X_TGE%y%;!DlyWctY+;i{S*fnF(%q-iDf3vdRv(DH%n}MHYbFveUb<}gNhkTD>;ON4pTVzS8g%h*2J_n_>CWb4 z{R6}OgMn`)KeTD4voE?1kCQoA};Q8z2mRqLhNWH}Y|ph)ZJ$!2Er z*rQr+SDG!d96L3(Y^BJu9`>KZ+9=ST%e*PKyR-Ssjj^#-rQKq!J3AG>S!qqyIF$Z1 zxnJ^#x$k+a^-I}6zc$-ZmvbA%LThPD{Rhpe8+`K+{hii>iwOwu0$4^Jd??voiO#!Iw>sgxH@TsN>ngYr=6?F* zn^R{!J|f@VV&GoUTRDe%xzPJPS-*Q5Zx7=~( zJ6-s_%=3vbW+C}Ki}wCluJwTf(Ayh*zrQ~IJBwLPEF|mf!j>1txVJIp+Yf(F=04y! zzVPk0nnUsTW;RC7J@#RCO@3wJ`|ZjZ@4PQ?ETINt_XBbwH2Y&`+4fbTIRH;iO>hSm zzI<>8Ve5Ce*?AoYNm(V5qv>rrlF?-Hy;dcXSJg2_z zSnfdl5oXuy{Q^!s$~*$(0_NF-?>)F~9{p0m+5a+jA26@I(dTD3_l>V&$35!%+hTtE zs_*ZdvBsHSzg=*yPhoo}>KE{SeAmXib}O@QOU_vRZ3P##+=lN^e>=0aj1>NT%*LB9 zdgQlaJ?cMWcHO;Q*Z13zbNz?H9$|J}-|r{Zf5JA`2yk8B?@3PI{r!g2>w8Dj!1Wcp zJ>R(Z<52S_jNh7CzlUo;)UH3ai$9+D_Pw6?>K`clbI9&D;5$5<+~(X2d@rtj);Bc?d{5TyTe=Z=R(Un<#h;6uzXy%}O~9P;cNE;s*w*Bl_1jB1^ZKr~1AF3o zGw%rV9bh|%eeT3I?h;~pnePH}j^OUbmh-$r^uqq#1Jt_aH|}r86XbC1Uf@1ztmQuD z`@uF~E!L{9&N_^F5TyNksNm!sX|Er~_Z`H&Jc2DJ9BS`kU;FkbFqfLx>oM#!{&9Rc z5qEWe5&s07In+e_lh|pkPvOgnh!5@4aOqyp;LC~7#$M0DnM+Od{yA)Ga0K@}ww&h- z?geb)9l^bbEvGK-?Imn;n!^}1-iP0vYf<+r*#7QBk6*=>6OQygUc*nduj9*!IAi2} z1J1o7@0-|i!eQQc^KW6l4%Eb(e;eCcT#KCVV5j@Pi!Ud3-TytfbpQA9{}15I zr6zj%A+|L*g8K+t&f0_f7~6P9aGzkysf+vg6x*EUFh)(>hih@h&#}|GzrdFh4s(X~ zOYBtp6~3H^Gpa4)e+}Be?{td!8!#WptJ#D3TOc2O`3~Eh@^LTUV_TDJ*1v;U&Kx7m zzkr{CYyLgbk9vQ@o(8V{%B=r4CpsPYH^<+HdB8CnoQ7@|^PI$dHT1Mx17z_u1gaEq|z z+$Xprv5j{GcNDgqx_DDZW1G_)#;CEk*63RF;}~rF7X3IDTTVF48QSBpQ|)4WIpIjP z$K$8kCHQh;*M6J;XD&5yrlr`{;t1|UY&rJ{?j&sE9l@Q9EtmG=6nt}tAQH(>-Xnc z)V~H>F5cVu*mA;Qy`jATJJnu@FDK%xzwq0z7JnTumzo#(z3FGZ2+03I9RtjczgUyM z7|8j1q5Ti@`ofow8V0e`8iw%Ygd?r@68uzqDZZSDdL!>;yJ$Dy%L#{hzoVautD`@0(3oaQh_jXja~H~3#rYMfO7 literal 0 HcmV?d00001 diff --git a/gsk/resources/vulkan/color-matrix.frag.glsl b/gsk/resources/vulkan/color-matrix.frag.glsl new file mode 100644 index 0000000000..21a324e780 --- /dev/null +++ b/gsk/resources/vulkan/color-matrix.frag.glsl @@ -0,0 +1,31 @@ +#version 420 core + +layout(location = 0) in vec2 inTexCoord; +layout(location = 1) in flat mat4 inColorMatrix; +layout(location = 5) in flat vec4 inColorOffset; + +layout(set = 0, binding = 0) uniform sampler2D inTexture; + +layout(location = 0) out vec4 color; + +vec4 +color_matrix (vec4 color, mat4 color_matrix, vec4 color_offset) +{ + /* unpremultiply */ + if (color.a != 0.0) + color.rgb /= color.a; + + color = color_matrix * color + color_offset; + color = clamp(color, 0.0, 1.0); + + /* premultiply */ + if (color.a != 0.0) + color.rgb *= color.a; + + return color; +} + +void main() +{ + color = color_matrix (texture (inTexture, inTexCoord), inColorMatrix, inColorOffset); +} diff --git a/gsk/resources/vulkan/color-matrix.frag.spv b/gsk/resources/vulkan/color-matrix.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..266c8777f56187e47dba4756918856154274e0b5 GIT binary patch literal 2160 zcmZ{jSx=Ke6o#j?MfOE@acRK?K@qiV5)eeFOR*>>UN%jaC8^9aCn$I zYQC?Oa+RP~$`yk~sn85gO7J>Dyr5R792dicxESH{Z_e2lrL(1+GbHKHCQc8d0^hJY z9h0QLE0V;>^SoK<#(a28opou%sI}(o4dR~f0 zKKgkoNj=^b{*Giszz-jL*ZGJ)cRKGy9Gm%(L;R)FegD|Zkoc0O$T_?{ANTwr53{8f zZ_OV1T;88O^fqz!5PMzxP04M6`(V>^TA<%|stWI!00;kuPNY6Q_}n2Y&_6NG!X`%U zYk}U0aW3|%BE;SZ{Qjv&9&vcgir8=6ctzmO@Zs{YU(4cgmma5c&)$%q-RE5fB)62$ zZVe0Y**W@SW+MXrZ{o0D8@cPi#WKM{RUpds2F9?aT7v_iw>(5KdN| zv%}W}e1MPnGTVK1Mm!-V!wzagERFRH{WZVGVld(JKCy!%JTnUM|;zdsY7=iio2&3#p*=A6L0 zhv8#)?^GrR-$WaIZcupk|u-+>3x`Pczs_XT|H z0J^XJPl&< TYu`80*Lx(LdVds0=QsBk!$zG( literal 0 HcmV?d00001 diff --git a/gsk/resources/vulkan/opacity.vert.glsl b/gsk/resources/vulkan/color-matrix.vert.glsl similarity index 74% rename from gsk/resources/vulkan/opacity.vert.glsl rename to gsk/resources/vulkan/color-matrix.vert.glsl index 7e12d41e1a..20b3bbd8d0 100644 --- a/gsk/resources/vulkan/opacity.vert.glsl +++ b/gsk/resources/vulkan/color-matrix.vert.glsl @@ -2,7 +2,8 @@ layout(location = 0) in vec4 inRect; layout(location = 1) in vec4 inTexRect; -layout(location = 2) in float inOpacity; +layout(location = 2) in mat4 inColorMatrix; +layout(location = 6) in vec4 inColorOffset; layout(push_constant) uniform PushConstants { mat4 mvp; @@ -12,7 +13,8 @@ layout(push_constant) uniform PushConstants { } push; layout(location = 0) out vec2 outTexCoord; -layout(location = 1) out flat float outOpacity; +layout(location = 1) out flat mat4 outColorMatrix; +layout(location = 5) out flat vec4 outColorOffset; out gl_PerVertex { vec4 gl_Position; @@ -30,5 +32,6 @@ void main() { gl_Position = push.mvp * vec4 (pos, 0.0, 1.0); outTexCoord = inTexRect.xy + inTexRect.zw * offsets[gl_VertexIndex]; - outOpacity = inOpacity; + outColorMatrix = inColorMatrix; + outColorOffset = inColorOffset; } diff --git a/gsk/resources/vulkan/color-matrix.vert.spv b/gsk/resources/vulkan/color-matrix.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..2985b7409d2243baadada0bce904d3d12d952ec8 GIT binary patch literal 2316 zcmZ9MTT>H35QPVF;ie)Y7Zovx;)RQ-fG8p$VgO?iFXd~*WPz;;yQySBeA5Sifd9cC z>5EmKZ*~V)C)G7`PM_)N>FG_TeZ0e%HvKwH$;6}2vod@`g&ItGRT3*yLIh{Em+z44` zZJvJcR^g3s-sZetuYB;Dk$18c)V!0JpU@uhWv>~#1f|X!cm}?(AKwN82JWckm2Ejobju={xh%O80D z{(%i`?=>yHp))lJ=j}V0xrSc2~Bkh_0S+jH2EPj{9$>YL>G&cUr@7 zVFod%BSTGX&dVG}ZPBf!IO4*UQyevg`zYgl;-Mp7dO4jxH3SnIEj`ZHfR^=NUsha< z<5(H{9XKs@M9aO{OZ~ukS-(za&zRzq8|y)>@D*f3(sNfZz5(G*%>@}_GQnM1qZtwI z*32Hbf-v>Q2fvhHz8g69GoO_)rj#Xn$sG=JnqIAq`MTmX)E^Fw6yYnExd>YIId|A;IX~Tfw6T)1T<^ zk7*`8=Z&iV6Pk&Q@0MoX29CX8{sZ8s4KeS?7{kK!JA27>R8i?M$HBX}Q(E&z_=yXi zPB_k;N!IKIFKFgWw|_CgQOPW%h%8~T$wGtm4JL(j99_vF8sT%XBH|Iq`>@^PO_GTv`T3N)7!4xT|?PJ2b` zw01-o4kHK7M(cWjcV1H_W16qaIJ+Q2!&&1p`0q*Y-_V+v@ZS>drq<+ykNmj{9C3N4 zdotdRJ|HeNoRz`5bM9-+zBk&F*Ze>R$8g+3t>L(DS=mvWIT>1fd~1A1KNJJsyo__u zkPC10NJf8>3%P>Pkq3L0Wb}or_0xodXQXSrES%Op6Nbb7ul0(!bgfr~sWrT-!J5{q wGFR*8S`!oA)p}iPa*BN!+tYBauA5rZm)wp11-rYw(wd&cN3Vi^>qd*RKMmHdkpKVy literal 0 HcmV?d00001 diff --git a/gsk/resources/vulkan/opacity-clip-rounded.frag.spv b/gsk/resources/vulkan/opacity-clip-rounded.frag.spv deleted file mode 100644 index 42fa1561845f65cd5e79379ade471416c9cfd6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5584 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 diff --git a/gsk/resources/vulkan/opacity-clip.vert.spv b/gsk/resources/vulkan/opacity-clip.vert.spv deleted file mode 100644 index 81aa4f6f85859a436f5b6148e435eeadcc49f805..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4788 zcmZ9OhjUa_6viK<5Q-?$tQf?Cg4nR4fTFHwoJ6tD=qBuL$ZFV)*-gX_BKF>U@4a{M z&(d*5$KUVe9lVq4eB5)s`<-*oJ@>wi9Wz(V%CZ^!*OUE`O^pTFO#CdHn|0@Nsc%c) znpV5IX6+fLsFacR=quH5h1 z-|H2*Le2ji4?R05(Rl~zHYS|?mm5g9j)EIxE^%Jpjymh{G5Cf~1nw0*l5?n+3%%ci z^}Dz6_9D)s);`QH*0fWt-;chz7V@w2a$>AcdkI!Ib1zs*ZqKXlx6#YLJb?H9L(&R{JO&TyOJ~Bc@c1|rUqjd133|z zCD>WEb3oEA?vTQl5AING{V8sCUdLhh?qLpNgtpp6oV1kto!p;yGIjRVbjdzl z0iw2;J?G8vGk_Y;sqfpAI|P4_*)@B=j8hLW4+6P>dA8zv53ZX>zfy4azlz-p%xiD- z`AN)uU56S4j~wz*5#_Za$H3tqkZ>Yu~O%ry%9D{CIt)L6TG#5b|!`iZcgV?a(g>`7>E!%ns1 z_;SLY*(Y~=hNH2VB}XXcdORd9D=Ta#$}+r z?1}Hmyo1cUz)leR+>dSCmBe`GyMde|xCgN1JnsO#uz!1iTG#xB{cU)L9IibG+((VI zJjDDkxCdB^wd$+04r3k#Y5yK8IC)3f>&NkZ2XQY?V9N=I+THAH-<|~KQWJYUg`LJf zjV~wSt{yJppMf)nnuvcEJFWFOd^r*Ep?w}M-RlK>IT6~}>qR(osfpgdgl!Fu;9ka- z^PIuGf^EDbxL2{|)WyBMhHXxB7^BAf@Vj#@>V5;;-<9a`o7i%~k>1B!_^I}7d^r(k zjJ)r_xmVjJJ-E-Yjduk11-6{JxQ{Qf&1nu})Wm(b7H9khJFWX$d^zDT zXK25}PPO0T%ZWIn+A97Jpbh*^Cz*c)3xT|v`OH57`RL2f*yfavd-(<1nq0H~ubJh{ z(apRM>;W7ODNYjiF8aXhwti+-%cmJ<$hhV}&PRC^-6oN%PtRrslPHNKpf z-j9>u%%vvIv+>5qyYQ{woN8mwbFkAr&&8J$(W}s|gG={34_{7%HugLp z&KkUXbE=IVt;e<|M{pakqt4(q!kNbr+y&T?JKo!caOO0}Mxe(2`u({U^>4zKi}!XB zww!QSZ)h*ZPPLcd%ZWJaK7Jc6#or9frRG(BQ%cO20r@|vqmS9~H*4~j137;$wEtzk zqVVOThJNg{h5>vz;YjPf5ol*gIRDecKQ=+p#UD!|~<#?6#hs4L^N=v1@Hd zgtMo(O=;vN&I%mQBrhd>NmpEaDxzCknazGHaMQLe97o|~5{`dF$$TE&)^~Xt7_6Bm`nKYX|E2v1*j_ILYd}_siLEH2XL*cssHuWnNa&;78KS zIA5rY!}NXc59~-dE3VR?^`csF0ymeleJ{&uN?hRP%!?6~i?ZSH=c`<84y$)R%bEx_!pr~i&L zHU#|8-{JH%-?qo_@WFX1%_|^ge`E=y;W8)RVm%u(^Zmf*^3&rB z3H^cTf&EkeT3O(|mcYS&p$g=~2A`hZNazP2xxwG$A@;3=H%tsZIP4btUrqQ`!VGZX sarj1G#G`lKId}TzjWZi>h1$gIN#Lw|>FN&em(RJcI~?r)6bq*2e>5jiTL1t6 diff --git a/gsk/resources/vulkan/opacity.vert.spv b/gsk/resources/vulkan/opacity.vert.spv deleted file mode 100644 index d0c9b86128ce45422d4e4766a8323c08c7922306..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2148 zcmZ9M*-{fh6ownJuqlYhq9O)STv$W}M3GIzKowQQrM!)p3}mXpOe&cm-06i6;5+z` z-dN@T^-SZGojRQJ|7Ypbr+dhBPIVd6pS+_shkDgW~>9xzcEq zThV#lE7$$ND_8xdSBd;nkGSqsoF7!`?P@w8r-=0aV7dyAj#^&SGCA!zEZhjOv$j7! zc(3wCIB$DBu9rV~&B#033##5(%ug#ve93FZEYU_e$PL}`bSECwym(6GTmalpKam|*t z=b97W(4JDlIXnBX9ewo9w!^SlwH$Zh2cqKRTaLR?+(F~8;z#FkE_dYz7nJTUp4)_Y z7MMHklRT2_s*;-v9IL3g!*Pz?)Y)?u=PqV3CCs7*^I+*wnky2=F(cwOQyg{SN-2)n zzAWC<**<2h^)MHK{Ben=pT%4 zSh!odAYsiUxJNcIZ-$C}E8W^M=W#*9leS z-8c^3)t!~i9pR@gcrM}CcRsPn1usjpr^{bSFg=qG=3Np4W+uGL4hi{hr15c1{9xWG z9R9b`#5zB?m~hK_7rZ~t#3JXn7`{JhabNsjq?dJhd0*V|ntb$oUBdkwD1w+92?x(& zUl)5*b~<)k7!IKa_9oWdG55HoP9~-ANZ7j|A%?xCB=A3yw|!SOHQ~P}+&$U!gpd9? z3mkR1hsP4`hI^(icd{UXcl$h%P2M}@FvF)3IF{p{$%f;+C3VMa7A3^u<6Gi8`KcQC zmL%*$481H%KbP?S=!IUv#L)*is}k